//第九天错题

//2024年3月6日

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
//1.
//int main()
//{
//	//*p[4]是一个指针数组，即存放指针的数组
//	int a[12] = { 1,2,3,4,5,6,7,8,9,10,11,12 }, * p[4], i;
//	bool flag = true;
//
//	for (i = 0; i < 4; i++)
//	{
//		//该语句等同于将a[12]三个一分，并将每三个的首地址存放在*p[4]中
//		//即，*p[4]相当于一个二维数组
//		p[i] = &a[i * 3];
//	}
//
//	printf("%d\n",p[3][2]);
//	return 0;
//}

//2.如何正确描述sizeof(double)

//sizeof是C语言中的一个操作符，不是函数调用，简单的说其作用就是返回一个对象或者类型所占的内存字节数，结果是无符号整数
//因此可以把它看作是整型表达式。

//3.
int main()
{
	int x = 0;
	//逗号表达式的结果取最后一个表达式的值
	//对于逗号表达式来说，括号位置的不同，表达式的结果不同，所以在使用逗号表达式的时候，一定要注意括号的使用
	//下面两个逗号表达式的值不同
	x = ((x = 4 * 5, x * 5), x + 5);
	x = (x = 4 * 5, x * 5), x + 5;
}

//4.除自身以外数组的乘积
int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
    int* ret = (int*)malloc(sizeof(int) * numsSize);
    *returnSize = numsSize;

    //计算当前数左侧元素乘积
    int i = 0;
    int left = 1;
    for (i = 0; i < numsSize; i++)
    {
        ret[i] = left;
        left *= nums[i];
    }

    //计算当前数右侧元素乘积
    int right = 1;
    for (i = numsSize - 1; i >= 0; i--)
    {
        ret[i] *= right;
        right *= nums[i];
    }

    return ret;
}
int main()
{
    int nums[4] = { 1,2,3,4 };
    int numsSize = sizeof(nums) / sizeof(nums[0]);
    int returnSize = 0;
    int* ret = productExceptSelf(nums, numsSize, &returnSize);
    int i = 0;
    for (i = 0; i < returnSize; i++)
    {
        printf("%d ", ret[i]);
    }
}